# include "students.h"

static void studentShow (Student *st) {
	if (st) printf(" %s (%d)\n",st->name,st->number);
}
CommandResult * command_listStudents (int argc, char *argv[]) {
	ArrayList *list = getStudentsList();
	Student *st;
	int i,n;
	if (list) {
		n = arrayGetLength(list);
		if (n>0) {
			if (n==1) printf("%d Aluno:\n",n);
			else printf("%d Alunos:\n",n);
		}
		for (i=0;i<n;i++) {
			st = arrayGet(list,i);
			if (!st) arrayRemoveFrom(list,i);
			else studentShow(st);
		}
		if (n <= 0) printf("Não existem alunos registados até ao momento\n");         
	}
	else printf("Não existem alunos registados até ao momento\n");
	return successCommandResult();
}

CommandResult * command_statusStudents (int argc, char *argv[]) {
	ArrayList *list = getStudentsList();
	int i,n = 0;
	Student *st;
	int sp=0,sn=0,se=0;
	if (list) n = arrayGetLength(list);
	printf("Informação sobre os alunos:\n\n");
	printf(" Total: %d\n",n);
	for (i=0;i<n;i++) {
		st = arrayGet(list,i);
		switch (st->type) {
			case NORMAL: sn++; break;
			case EXTRA: se++; break;
			case PROFESSIONAL: sp++; break;
		}
	}
	printf(" Mestrado: %d\n",sn);
	printf(" Como Extra-curricular: %d\n",se);
	printf(" Como Especialização: %d\n",sp);
	return successCommandResult();
}

CommandResult * command_removeStudent (int argc, char *argv[]) {
	int i,found=0,n = 0;
	int number = -1;
	if (!hasProject()) {
		printf("Não há projectos activos\n");
		return successCommandResult();
	}
	ArrayList *lst = getStudentsList();
	Student *st;
	if (lst) n = arrayGetLength(lst);
	if (argc == 0) {
		printf("Forneça o número do aluno\n");
	}
	else {
		number = atoi(argv[0]);
		for (i=0;i<n&&!found;i++) {
			st = arrayGet(lst,i);
			if (st->number == number) found = 1;
		}
		i--;
		if (found) {
			arrayRemoveFrom(lst,i);
			setProjectUnsaved();
			freeStudent(st);
			printf("Aluno %d removido com sucesso!\n",number);
		} else {
			printf("Aluno com número %d não existe\n",number);
		}
	}
	return successCommandResult();	
}
CommandResult * command_addStudent (int argc, char *argv[]) {
	int number, type;
	char name[300];
	if (!hasProject()) {
                printf("Não há projectos activos\n");
                return successCommandResult();
        }
	CommandResult *res = successCommandResult();
	Student *st = newStudent();
	ArrayList *aList = getStudentsList();
	printf("Nome: ");
	st->name = lerString();
	if (!st->name||!strcmp(st->name,"")) {
		printf("Nome Inválido\n");
		if (st->name) free(st->name);
		if (st->selections) free(st->selections);
		free(st);
		return res;
	}
	printf("Número: ");
	scanf("%d",&number);
	if (!number) {
		printf("Número Inválido\n");
		freeStudent(st);
		return res;
	} else st->number = number;
	printf("Tipo de Aluno:\n");
	printf(" %d -> Mestrado\n",NORMAL);
	printf(" %d -> Especialização\n",PROFESSIONAL);
	printf(" %d -> Extra-curricular\n",EXTRA);
	printf("Escolha: ");
	scanf("%d",&type);
	st->type = (StudentType) type;
	printf("Média (0 - 200): ");
	scanf("%d",&number);
	st->average = number;
	char *str = getConfigurationValue(CONFIG_NORMAL_ALSO);
	int cfg = 0;
	if (str) cfg = atoi(str);
	if (st->type != NORMAL || cfg ) {
		printf("UCE's a candidatar-se?: ");
		scanf("%d",&number);
		st->ucesWanted = number;
	} 
	printf("1º Ano que concurreu a uma UCE: ");
	scanf("%d",&number);
	st->year = number;
	// para cada UCE deixar voto
	LinkedList *lst;
	ChainingHashMap *map = getUCEsMap();
	char *uceName;
	if (map) {
		lst = keySetChaining(map);
		if (lst) printf("De 0 a 10 classifique a importância de cada UCE\n");
		while (lst) {
			uceName = getData(lst);
			if (uceName) {
				printf("%s: ",uceName);
				scanf("%d",&number);
				st->selections = insertElemHead(st->selections,newSelection(strdup(uceName),number));
			}
			lst = lst->next;
		}
	}
	arrayInsert(aList,st);
	setProjectUnsaved();
	printf("\nAluno inserido com sucesso!\n");
	return res;
}

CommandResult * command_showStudent (int argc, char *argv[]) {
	ArrayList *lst = getStudentsList();
	Student *st;
	LinkedList *chs;
	Selection *sel;
	int i,n=0,found=0;
	if (!hasProject()) {
                printf("Não há projectos activos\n");
                return successCommandResult();
        }
	if (argc != 1) {
		printf("Forneça o número do aluno\n");
	} else {
		if (lst) n = arrayGetLength(lst);
		for (i=0;i<n&&!found;i++) {
			st = arrayGet(lst,i);
			if (st->number == atoi(argv[0])) found = 1;
		}
		if (found) {
			printf("Nome: %s\nNúmero: %d\nMédia: %d\n",st->name,st->number,st->average);
			switch (st->type) {
				case NORMAL: printf("Tipo: Mestrado\n"); break;
				case EXTRA: printf("Tipo: Extra-curricular\n"); break;
				case PROFESSIONAL: printf("Tipo: Especialização\n"); break;
			}
			chs = st->selections;
			if (chs) {
				printf("Preferências:\n");
				while (chs) {
					sel = getData(chs);
					printf(" %s (%d)\n",sel->uceName,sel->preference);
					chs = chs->next;
				}
			}
		} else printf("Aluno com número %s não existe\n",argv[0]);
	}
	return successCommandResult();
}
